package util.AST.Comando;

import checker.SemanticException;
import checker.Visitor;
import util.AST.Expressao.ExpressaoAri;
import util.AST.Terminal.ID;

public class DecVariavel extends ComandoSimples {
	
	private String tipo;
	private ID nomeVariavel;
	private ExpressaoAri expAri;
	private ChamadaFuncao chamadaFuncao;
	
	
	public DecVariavel(ID nome, ExpressaoAri expAri, ChamadaFuncao chamadaF){
		this.nomeVariavel = nome;
		this.expAri = expAri;
		this.chamadaFuncao = chamadaF;
		
		if(expAri==null){
			this.tipo = chamadaF.getTipo();
		}else{
			this.tipo = expAri.getTipo();
			}
	}
	
	public ID getNomeVar(){
		return this.nomeVariavel;
	}
	
	public ExpressaoAri getExpAri(){
		return this.expAri;
	}
	
	public ChamadaFuncao getChamadaFuncao(){
		return this.chamadaFuncao;
	}

	public String toString(int level) {
		int nextLevel = level+5;
		StringBuffer str = new StringBuffer();
		str.append("DecVar\n");
		if ( this.nomeVariavel != null ) {
			str.append(super.getSpaces(nextLevel) + "|-" + this.nomeVariavel.toString(nextLevel));
		}
		if(this.expAri != null){
			str.append(super.getSpaces(nextLevel) + "|-" + this.expAri.toString(nextLevel));
		}
		
		if(this.chamadaFuncao != null){
			str.append(super.getSpaces(nextLevel) + "|-" + this.chamadaFuncao.toString(nextLevel));
		}
		return str.toString();
	}

	@Override
	public Object visit(Visitor v, Object o) throws SemanticException {
		return v.visitDecVariavel(this, o);
	}

	public String getTipo() {
		return tipo;
	}

	public void setTipo(String tipo) {
		this.tipo = tipo;
	}


}
